ã²ãŒã ãšã³ãžã³ã«ãããã³ã³ããŒãã³ãã·ã¹ãã ã®ã¢ãŒããã¯ãã£ããã®å©ç¹ãå®è£ 詳现ãé«åºŠãªãã¯ããã¯ãæ¢æ±ããŸããäžçäžã®ã²ãŒã éçºè ã®ããã®ç·åã¬ã€ãã
ã²ãŒã ãšã³ãžã³ã¢ãŒããã¯ãã£ïŒã³ã³ããŒãã³ãã·ã¹ãã ã®æ·±å±€æ¢æ±
ã²ãŒã éçºã®äžçã«ãããŠãåªããæ§é ãæã€ã²ãŒã ãšã³ãžã³ã¯ãæ²¡å ¥æã®ããé åçãªäœéšãåµé ããããã«äžå¯æ¬ ã§ããã²ãŒã ãšã³ãžã³ã§æã圱é¿åã®ããã¢ãŒããã¯ãã£ãã¿ãŒã³ã®1ã€ãã³ã³ããŒãã³ãã·ã¹ãã ã§ãããã®ã¢ãŒããã¯ãã£ã¹ã¿ã€ã«ã¯ãã¢ãžã¥ãŒã«æ§ãæè»æ§ãåå©çšæ§ãéèŠããŠãããéçºè ã¯ç¬ç«ããã³ã³ããŒãã³ãã®éåããè€éãªã²ãŒã ãšã³ãã£ãã£ãæ§ç¯ã§ããŸãããã®èšäºã§ã¯ãäžçäžã®ã²ãŒã éçºè ã察象ã«ãã³ã³ããŒãã³ãã·ã¹ãã ããã®å©ç¹ãå®è£ ã«é¢ããèæ ®äºé ãããã³é«åºŠãªãã¯ããã¯ã«ã€ããŠå æ¬çã«æ¢æ±ããŸãã
ã³ã³ããŒãã³ãã·ã¹ãã ãšã¯ïŒ
ãã®æ žå¿ã«ãããŠãã³ã³ããŒãã³ãã·ã¹ãã ïŒå€ãã®å Žåããšã³ãã£ãã£ã»ã³ã³ããŒãã³ãã»ã·ã¹ãã ãŸãã¯ECSã¢ãŒããã¯ãã£ã®äžéšïŒã¯ãç¶æ¿ãããã³ã³ããžã·ã§ã³ïŒåæïŒãä¿é²ãããã¶ã€ã³ãã¿ãŒã³ã§ããæ·±ãã¯ã©ã¹éå±€ã«äŸåãã代ããã«ãã²ãŒã ãªããžã§ã¯ãïŒãŸãã¯ãšã³ãã£ãã£ïŒã¯ãåå©çšå¯èœãªã³ã³ããŒãã³ãå ã«ã«ãã»ã«åãããããŒã¿ãšããžãã¯ã®ã³ã³ãããšããŠæ±ãããŸããåã³ã³ããŒãã³ãã¯ããšã³ãã£ãã£ã®äœçœ®ãå€èгãç©çç¹æ§ãAIããžãã¯ãªã©ããã®æ¯ãèããç¶æ ã®ç¹å®ã®åŽé¢ã衚ããŸãã
ã¬ãŽã»ãããæãæµ®ãã¹ãŠã¿ãŠãã ãããåã ã®ãããã¯ïŒã³ã³ããŒãã³ãïŒããããããããããŸããŸãªæ¹æ³ã§çµã¿åãããããšã§ãè»ãå®¶ããããããªã©ãæ³åã§ãããããããªããžã§ã¯ãïŒãšã³ãã£ãã£ïŒãèšå€§ã«äœãåºãããšãã§ããŸããåæ§ã«ãã³ã³ããŒãã³ãã·ã¹ãã ã§ã¯ãããŸããŸãªã³ã³ããŒãã³ããçµã¿åãããŠã²ãŒã ãšã³ãã£ãã£ã®ç¹æ§ãå®çŸ©ããŸãã
äž»èŠãªæŠå¿µïŒ
- ãšã³ãã£ã㣠(Entity): ã¯ãŒã«ãå ã®ã²ãŒã ãªããžã§ã¯ãã衚ãäžæã®èå¥åã§ããåºæ¬çã«ã¯ãã³ã³ããŒãã³ããã¢ã¿ããããã空ã®ã³ã³ããã§ãããšã³ãã£ãã£èªäœã¯ããŒã¿ãããžãã¯ãå«ã¿ãŸããã
- ã³ã³ããŒãã³ã (Component): ãšã³ãã£ãã£ã«é¢ããç¹å®ã®æ å ±ãæ ŒçŽããããŒã¿æ§é ã§ããäŸãšããŠãPositionComponentãVelocityComponentãSpriteComponentãHealthComponentãªã©ããããŸããã³ã³ããŒãã³ãã¯ããžãã¯ã§ã¯ãªãã*ããŒã¿*ã®ã¿ãå«ã¿ãŸãã
- ã·ã¹ãã (System): ç¹å®ã®ã³ã³ããŒãã³ãã®çµã¿åãããæã€ãšã³ãã£ãã£ã«å¯ŸããŠåäœããã¢ãžã¥ãŒã«ã§ããã·ã¹ãã ã¯*ããžãã¯*ãå«ã¿ããšã³ãã£ãã£ãå埩åŠçããŠãããããæã€ã³ã³ããŒãã³ãã«åºã¥ããŠã¢ã¯ã·ã§ã³ãå®è¡ããŸããäŸãã°ãã¬ã³ããªã³ã°ã·ã¹ãã (RenderingSystem) ã¯ãPositionComponentãšSpriteComponentã®äž¡æ¹ãæã€ãã¹ãŠã®ãšã³ãã£ãã£ãå埩åŠçããæå®ãããäœçœ®ã«ã¹ãã©ã€ããæç»ãããããããŸããã
ã³ã³ããŒãã³ãã·ã¹ãã ã®å©ç¹
ã³ã³ããŒãã³ãã·ã¹ãã ã¢ãŒããã¯ãã£ã®æ¡çšã¯ãç¹ã«ã¹ã±ãŒã©ããªãã£ãä¿å®æ§ãæè»æ§ã®èгç¹ãããã²ãŒã éçºãããžã§ã¯ãã«æ°å€ãã®å©ç¹ããããããŸãã
1. ã¢ãžã¥ãŒã«æ§ã®åäž
ã³ã³ããŒãã³ãã·ã¹ãã ã¯ãé«åºŠã«ã¢ãžã¥ãŒã«åãããèšèšãä¿é²ããŸããåã³ã³ããŒãã³ãã¯ç¹å®ã®æ©èœãã«ãã»ã«åããŠãããããçè§£ã倿Žãåå©çšã容æã«ãªããŸãããã®ã¢ãžã¥ãŒã«æ§ã«ãããéçºããã»ã¹ãç°¡çŽ åããã倿Žãå ããéã«æå³ããªãå¯äœçšãå°å ¥ãããªã¹ã¯ãäœæžãããŸãã
2. æè»æ§ã®åäž
åŸæ¥ã®ãªããžã§ã¯ãæåã®ç¶æ¿ã¯ãå€åããèŠä»¶ã«é©å¿ããã®ãé£ãã硬çŽããã¯ã©ã¹éå±€ã«ã€ãªããå¯èœæ§ããããŸããã³ã³ããŒãã³ãã·ã¹ãã ã¯ãã¯ããã«å€§ããªæè»æ§ãæäŸããŸããæ°ããã¯ã©ã¹ãäœæããããæ¢åã®ã¯ã©ã¹ã倿Žãããããããšãªãããšã³ãã£ãã£ããã³ã³ããŒãã³ããç°¡åã«è¿œå ãŸãã¯åé€ããŠããã®æ¯ãèãã倿Žã§ããŸããããã¯ã倿§ã§ãã€ãããã¯ãªã²ãŒã ã¯ãŒã«ããäœæããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒ æåã¯åçŽãªNPCã ã£ããã£ã©ã¯ã¿ãŒãæ³åããŠã¿ãŠãã ãããã²ãŒã ã®åŸåã§ããã¬ã€ã€ãŒãæäœã§ããããã«ããããšã«ããŸãããã³ã³ããŒãã³ãã·ã¹ãã ã䜿ãã°ãããŒã¹ã®NPCã³ãŒãã倿Žããããšãªãããšã³ãã£ãã£ã«`PlayerInputComponent`ãš`MovementComponent`ã远å ããã ãã§æžã¿ãŸãã
3. åå©çšæ§ã®åäž
ã³ã³ããŒãã³ãã¯ãè€æ°ã®ãšã³ãã£ãã£éã§åå©çšã§ããããã«èšèšãããŠããŸããåäžã®`SpriteComponent`ã¯ããã£ã©ã¯ã¿ãŒããçºå°ç©ãç°å¢èŠçŽ ãŸã§ãããŸããŸãªçš®é¡ã®ãªããžã§ã¯ãã®ã¬ã³ããªã³ã°ã«äœ¿çšã§ããŸãããã®åå©çšæ§ã«ãããã³ãŒãã®éè€ãæžããéçºããã»ã¹ãå¹çåãããŸãã
äŸïŒ `DamageComponent`ã¯ããã¬ã€ã€ãŒãã£ã©ã¯ã¿ãŒãšæµAIã®äž¡æ¹ã§äœ¿çšã§ããŸãããã¡ãŒãžãèšç®ãã广ãé©çšããããžãã¯ã¯ããã®ã³ã³ããŒãã³ããææãããšã³ãã£ãã£ã«é¢ä¿ãªãåããŸãŸã§ãã
4. ããŒã¿æåèšèšïŒDODïŒãšã®äºææ§
ã³ã³ããŒãã³ãã·ã¹ãã ã¯ãæ¬è³ªçã«ããŒã¿æåèšèšïŒDODïŒã®ååã«é©ããŠããŸããDODã¯ããã£ãã·ã¥ã®å©çšçãæé©åããããã©ãŒãã³ã¹ãåäžãããããã«ã¡ã¢ãªå ã®ããŒã¿ãé 眮ããããšãéèŠããŸããã³ã³ããŒãã³ãã¯éåžžãããŒã¿ã®ã¿ãæ ŒçŽããïŒé¢é£ããžãã¯ãæããªãïŒãããé£ç¶ããã¡ã¢ãªãããã¯ã«ç°¡åã«é 眮ã§ããã·ã¹ãã ã倿°ã®ãšã³ãã£ãã£ãå¹ççã«åŠçã§ããããã«ãªããŸãã
5. ã¹ã±ãŒã©ããªãã£ãšä¿å®æ§
ã²ãŒã ãããžã§ã¯ããè€éã«ãªãã«ã€ããŠãä¿å®æ§ã®éèŠæ§ããŸããŸãé«ãŸããŸããã³ã³ããŒãã³ãã·ã¹ãã ã®ã¢ãžã¥ãŒã«çãªæ§è³ªã«ãããå€§èŠæš¡ãªã³ãŒãããŒã¹ã®ç®¡çã容æã«ãªããŸããããã³ã³ããŒãã³ããžã®å€æŽãã·ã¹ãã ã®ä»ã®éšåã«åœ±é¿ãäžããå¯èœæ§ãäœããªãããã°ãå°å ¥ãããªã¹ã¯ãæžå°ããŸãããŸããé¢å¿ã®åé¢ãæç¢ºã§ãããããæ°ããããŒã ã¡ã³ããŒããããžã§ã¯ããçè§£ããè²¢ç®ãããããªããŸãã
6. ç¶æ¿ããã³ã³ããžã·ã§ã³
ã³ã³ããŒãã³ãã·ã¹ãã ã¯ã匷åãªèšèšååã§ãããç¶æ¿ããã³ã³ããžã·ã§ã³ããæ¯æããŸããç¶æ¿ã¯ã¯ã©ã¹éã®å¯çµåãçã¿åºãããè匱ãªåºåºã¯ã©ã¹ãåé¡ã«ã€ãªããå¯èœæ§ããããŸãããã®åé¡ã§ã¯ã芪ã¯ã©ã¹ãžã®å€æŽããã®åã¯ã©ã¹ã«æå³ããªãçµæãããããããšããããŸããäžæ¹ãã³ã³ããžã·ã§ã³ã¯ãããå°ããç¬ç«ããã³ã³ããŒãã³ããçµã¿åãããããšã§è€éãªãªããžã§ã¯ããæ§ç¯ããããšãå¯èœã«ããããæè»ã§å ç¢ãªã·ã¹ãã ãå®çŸããŸãã
ã³ã³ããŒãã³ãã·ã¹ãã ã®å®è£
ã³ã³ããŒãã³ãã·ã¹ãã ãå®è£ ããã«ã¯ãããã€ãã®éèŠãªèæ ®äºé ããããŸããå ·äœçãªå®è£ ã®è©³çްã¯ãããã°ã©ãã³ã°èšèªãã¿ãŒã²ãããã©ãããã©ãŒã ã«ãã£ãŠç°ãªããŸãããåºæ¬çãªååã¯åãã§ãã
1. ãšã³ãã£ãã£ç®¡ç
æåã®ã¹ãããã¯ããšã³ãã£ãã£ã管çããããã®ã¡ã«ããºã ãäœæããããšã§ããéåžžããšã³ãã£ãã£ã¯æŽæ°ãGUIDãªã©ã®äžæã®èå¥åã§è¡šãããŸãããšã³ãã£ãã£ãããŒãžã£ãŒã¯ããšã³ãã£ãã£ã®äœæãç Žæ£ãè¿œè·¡ãæ åœããŸãããããŒãžã£ãŒã¯ãšã³ãã£ãã£ã«çŽæ¥é¢é£ããããŒã¿ãããžãã¯ãä¿æããã代ããã«ãšã³ãã£ãã£IDã管çããŸãã
äŸ (C++):
class EntityManager {
public:
Entity CreateEntity() {
Entity entity = nextEntityId_++;
return entity;
}
void DestroyEntity(Entity entity) {
// Remove all components associated with the entity
for (auto& componentMap : componentStores_) {
componentMap.second.erase(entity);
}
}
private:
Entity nextEntityId_ = 0;
std::unordered_map> componentStores_;
};
2. ã³ã³ããŒãã³ãã¹ãã¬ãŒãž
ã³ã³ããŒãã³ãã¯ãã·ã¹ãã ãç¹å®ã®ãšã³ãã£ãã£ã«é¢é£ä»ããããã³ã³ããŒãã³ãã«å¹ççã«ã¢ã¯ã»ã¹ã§ãããããªæ¹æ³ã§æ ŒçŽããå¿ èŠããããŸããäžè¬çãªã¢ãããŒãã¯ãã³ã³ããŒãã³ãã¿ã€ãããšã«å¥ã ã®ããŒã¿æ§é ïŒå€ãã®å Žåãããã·ã¥ããããé åïŒã䜿çšããããšã§ããåæ§é ã¯ããšã³ãã£ãã£IDãã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã«ãããã³ã°ããŸãã
äŸ (æŠå¿µ):
ComponentStore positions;
ComponentStore velocities;
ComponentStore sprites;
3. ã·ã¹ãã èšèš
ã·ã¹ãã ã¯ã³ã³ããŒãã³ãã·ã¹ãã ã®äž»åã§ãããšã³ãã£ãã£ãåŠçãããã®ã³ã³ããŒãã³ãã«åºã¥ããŠã¢ã¯ã·ã§ã³ãå®è¡ãã責任ããããŸããåã·ã¹ãã ã¯éåžžãç¹å®ã®ã³ã³ããŒãã³ãã®çµã¿åãããæã€ãšã³ãã£ãã£ã«å¯ŸããŠåäœããŸããã·ã¹ãã ã¯ãé¢å¿ã®ãããšã³ãã£ãã£ãå埩åŠçããå¿ èŠãªèšç®ãæŽæ°ãå®è¡ããŸãã
äŸïŒ `MovementSystem`ã¯ã`PositionComponent`ãš`VelocityComponent`ã®äž¡æ¹ãæã€ãã¹ãŠã®ãšã³ãã£ãã£ãå埩åŠçãããã®é床ãšçµéæéã«åºã¥ããŠäœçœ®ãæŽæ°ãããããããŸããã
class MovementSystem {
public:
void Update(float deltaTime) {
for (auto& [entity, position] : entityManager_.GetComponentStore()) {
if (entityManager_.HasComponent(entity)) {
VelocityComponent* velocity = entityManager_.GetComponent(entity);
position->x += velocity->x * deltaTime;
position->y += velocity->y * deltaTime;
}
}
}
private:
EntityManager& entityManager_;
};
4. ã³ã³ããŒãã³ãã®èå¥ãšåå®å šæ§
åå®å šæ§ã確ä¿ããã³ã³ããŒãã³ããå¹ççã«èå¥ããããšã¯éåžžã«éèŠã§ãããã³ãã¬ãŒãã®ãããªã³ã³ãã€ã«æãã¯ããã¯ããåIDã®ãããªã©ã³ã¿ã€ã ãã¯ããã¯ã䜿çšã§ããŸããã³ã³ãã€ã«æãã¯ããã¯ã¯äžè¬çã«ããã©ãŒãã³ã¹ãåªããŠããŸãããã³ã³ãã€ã«æéãå¢å ããå¯èœæ§ããããŸããã©ã³ã¿ã€ã ãã¯ããã¯ã¯ããæè»ã§ãããã©ã³ã¿ã€ã ãªãŒããŒããããçºçãããå¯èœæ§ããããŸãã
äŸ (C++ãã³ãã¬ãŒã䜿çš):
template
class ComponentStore {
public:
void AddComponent(Entity entity, T component) {
components_[entity] = component;
}
T& GetComponent(Entity entity) {
return components_[entity];
}
bool HasComponent(Entity entity) {
return components_.count(entity) > 0;
}
private:
std::unordered_map components_;
};
5. ã³ã³ããŒãã³ãã®äŸåé¢ä¿ã®åŠç
äžéšã®ã·ã¹ãã ã¯ããšã³ãã£ãã£ã«å¯ŸããŠæäœãè¡ãåã«ãç¹å®ã®ã³ã³ããŒãã³ããååšããããšãèŠæ±ããå ŽåããããŸãããããã®äŸåé¢ä¿ã¯ãã·ã¹ãã ã®æŽæ°ããžãã¯å ã§å¿ èŠãªã³ã³ããŒãã³ãããã§ãã¯ããããããæŽç·ŽãããäŸåé¢ä¿ç®¡çã·ã¹ãã ã䜿çšããŠåŒ·å¶ããããšãã§ããŸãã
äŸïŒ `RenderingSystem`ã¯ããšã³ãã£ãã£ãã¬ã³ããªã³ã°ããåã«`PositionComponent`ãš`SpriteComponent`ã®äž¡æ¹ãååšããããšãèŠæ±ãããããããŸãããã©ã¡ããã®ã³ã³ããŒãã³ããæ¬ ããŠããå Žåãã·ã¹ãã ã¯ãã®ãšã³ãã£ãã£ãã¹ãããããŸãã
é«åºŠãªãã¯ããã¯ãšèæ ®äºé
åºæ¬çãªå®è£ ãè¶ ããŠãã³ã³ããŒãã³ãã·ã¹ãã ã®æ©èœãšããã©ãŒãã³ã¹ãããã«åäžãããããã€ãã®é«åºŠãªãã¯ããã¯ããããŸãã
1. ã¢ãŒãã¿ã€ã
ã¢ãŒãã¿ã€ãã¯ãã³ã³ããŒãã³ãã®ãŠããŒã¯ãªçµã¿åããã§ããåãã¢ãŒãã¿ã€ããæã€ãšã³ãã£ãã£ã¯åãã¡ã¢ãªã¬ã€ã¢ãŠããå ±æãããããã·ã¹ãã ã¯ããããããå¹ççã«åŠçã§ããŸãããã¹ãŠã®ãšã³ãã£ãã£ãå埩åŠçãã代ããã«ãã·ã¹ãã ã¯ç¹å®ã®ã¢ãŒãã¿ã€ãã«å±ãããšã³ãã£ãã£ãå埩åŠçã§ãããããããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
2. ãã£ã³ã¯é å
ãã£ã³ã¯é åã¯ãåãã¿ã€ãã®ã³ã³ããŒãã³ãããã£ã³ã¯ã«ã°ã«ãŒãåããŠãã¡ã¢ãªäžã«é£ç¶ããŠæ ŒçŽããŸãããã®é 眮ã«ããããã£ãã·ã¥ã®å©çšçãæå€§åãããã¡ã¢ãªã®æçåãæžå°ããŸããã·ã¹ãã ã¯ãããã®ãã£ã³ã¯ãå¹ççã«å埩åŠçããäžåºŠã«è€æ°ã®ãšã³ãã£ãã£ãåŠçã§ããŸãã
3. ã€ãã³ãã·ã¹ãã
ã€ãã³ãã·ã¹ãã ã«ãããã³ã³ããŒãã³ããšã·ã¹ãã ã¯çŽæ¥çãªäŸåé¢ä¿ãªãã«äºãã«éä¿¡ã§ããŸããã€ãã³ããçºçãããšïŒäŸïŒãšã³ãã£ãã£ããã¡ãŒãžãåããïŒãã¡ãã»ãŒãžãé¢å¿ã®ãããã¹ãŠã®ãªã¹ããŒã«ãããŒããã£ã¹ããããŸãããã®åé¢ã«ãããã¢ãžã¥ãŒã«æ§ãåäžãã埪ç°äŸåãå°å ¥ãããªã¹ã¯ãæžå°ããŸãã
4. 䞊ååŠç
ã³ã³ããŒãã³ãã·ã¹ãã ã¯äžŠååŠçã«é©ããŠããŸããã·ã¹ãã ã䞊åå®è¡ããããšã§ããã«ãã³ã¢ããã»ããµã掻çšããç¹ã«å€æ°ã®ãšã³ãã£ãã£ãååšããè€éãªã²ãŒã ã¯ãŒã«ãã§ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããããŒã¿ç«¶åãåé¿ããã¹ã¬ããã»ãŒããã£ã確ä¿ããããã«ã¯æ³šæãå¿ èŠã§ãã
5. ã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãº
ãšã³ãã£ãã£ãšãã®ã³ã³ããŒãã³ãã®ã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãºã¯ãã²ãŒã ã®ç¶æ ãä¿åããã³ããŒãããããã«äžå¯æ¬ ã§ãããã®ããã»ã¹ã«ã¯ããšã³ãã£ãã£ããŒã¿ã®ã¡ã¢ãªå 衚çŸãããã£ã¹ã¯ã«ä¿åããããããã¯ãŒã¯çµç±ã§éä¿¡ãããã§ãã圢åŒã«å€æããããšãå«ãŸããŸããå¹ççãªä¿åãšååŸã®ããã«ãJSONããã€ããªã·ãªã¢ã©ã€ãºã®ãããªåœ¢åŒã®äœ¿çšãæ€èšããŠãã ããã
6. ããã©ãŒãã³ã¹æé©å
ã³ã³ããŒãã³ãã·ã¹ãã ã¯å€ãã®å©ç¹ãæäŸããŸãããããã©ãŒãã³ã¹ã«æ³šæããããšãéèŠã§ããé床ãªã³ã³ããŒãã³ãã®ã«ãã¯ã¢ãããé¿ãããã£ãã·ã¥å©çšçãæé©åããããã«ããŒã¿ã¬ã€ã¢ãŠããæé©åããã¡ã¢ãªã¢ãã±ãŒã·ã§ã³ã®ãªãŒããŒããããåæžããããã«ãªããžã§ã¯ãããŒãªã³ã°ã®ãããªãã¯ããã¯ã®äœ¿çšãæ€èšããŠãã ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããã«ã¯ãã³ãŒãã®ãããã¡ã€ãªã³ã°ãäžå¯æ¬ ã§ãã
人æ°ã®ã²ãŒã ãšã³ãžã³ã«ãããã³ã³ããŒãã³ãã·ã¹ãã
å€ãã®äººæ°ã®ã²ãŒã ãšã³ãžã³ã¯ããã€ãã£ããŸãã¯æ¡åŒµæ©èœãéããŠãã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ãå©çšããŠããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
1. Unity
Unityã¯ãã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ãæ¡çšããŠããåºã䜿çšãããŠããã²ãŒã ãšã³ãžã³ã§ããUnityã®ã²ãŒã ãªããžã§ã¯ãã¯ãæ¬è³ªçã«`Transform`ã`Rigidbody`ã`Collider`ãã«ã¹ã¿ã ã¹ã¯ãªãããªã©ã®ã³ã³ããŒãã³ãã®ã³ã³ããã§ããéçºè ã¯ã³ã³ããŒãã³ãã远å ã»åé€ããŠãã©ã³ã¿ã€ã ã§ã²ãŒã ãªããžã§ã¯ãã®æ¯ãèãã倿Žã§ããŸããUnityã¯ãã³ã³ããŒãã³ããäœæããã³ç®¡çããããã®ããžã¥ã¢ã«ãšãã£ã¿ãšã¹ã¯ãªããã£ã³ã°æ©èœã®äž¡æ¹ãæäŸããŸãã
2. Unreal Engine
Unreal Engineãã³ã³ããŒãã³ãããŒã¹ã®ã¢ãŒããã¯ãã£ããµããŒãããŠããŸããUnreal Engineã®ã¢ã¯ã¿ãŒã«ã¯ã`StaticMeshComponent`ã`MovementComponent`ã`AudioComponent`ãªã©ãè€æ°ã®ã³ã³ããŒãã³ããã¢ã¿ããã§ããŸããUnreal Engineã®ãã«ãŒããªã³ãããžã¥ã¢ã«ã¹ã¯ãªããã£ã³ã°ã·ã¹ãã ã«ãããéçºè ã¯ã³ã³ããŒãã³ããæ¥ç¶ããŠè€éãªæ¯ãèããäœæã§ããŸãã
3. Godotãšã³ãžã³
Godotãšã³ãžã³ã¯ãããŒãïŒãšã³ãã£ãã£ã«äŒŒãŠããïŒãåïŒã³ã³ããŒãã³ãã«äŒŒãŠããïŒãæã€ããšãã§ããã·ãŒã³ããŒã¹ã®ã·ã¹ãã ã䜿çšããŠããŸããçŽç²ãªECSã§ã¯ãããŸããããã³ã³ããžã·ã§ã³ã®å©ç¹ãšååã®å€ããå ±æããŠããŸãã
ã°ããŒãã«ãªèæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ã³ã³ããŒãã³ãã·ã¹ãã ãèšèšããã³å®è£ ããéã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- ããŒã«ãªãŒãŒã·ã§ã³ïŒ ããã¹ãããã®ä»ã®ã¢ã»ããã®ããŒã«ãªãŒãŒã·ã§ã³ããµããŒãããããã«ã³ã³ããŒãã³ããèšèšããŸããäŸãã°ãããŒã«ã©ã€ãºãããããã¹ãæååãæ ŒçŽããããã«å¥ã®ã³ã³ããŒãã³ãã䜿çšããŸãã
- åœéåïŒ ã³ã³ããŒãã³ãã§ããŒã¿ãæ ŒçŽããã³åŠçããéã«ã¯ãç°ãªãæ°å€åœ¢åŒãæ¥ä»åœ¢åŒãæåã»ãããèæ ®ããŸãããã¹ãŠã®ããã¹ãã«Unicodeã䜿çšããŠãã ããã
- ã¹ã±ãŒã©ããªãã£ïŒ ç¹ã«ã²ãŒã ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã察象ãšããŠããå Žåã¯ã倿°ã®ãšã³ãã£ãã£ãšã³ã³ããŒãã³ããå¹ççã«åŠçã§ããããã«ã³ã³ããŒãã³ãã·ã¹ãã ãèšèšããŸãã
- ã¢ã¯ã»ã·ããªãã£ïŒ ã¹ã¯ãªãŒã³ãªãŒããŒã代æ¿å ¥åæ¹æ³ãªã©ã®ã¢ã¯ã»ã·ããªãã£æ©èœããµããŒãããããã«ã³ã³ããŒãã³ããèšèšããŸãã
- æåçãªé æ ®ïŒ ã²ãŒã ã®ã³ã³ãã³ããã¡ã«ãã¯ã¹ãèšèšããéã«ã¯ãæåçãªéãã«æ³šæããŠãã ãããã¹ãã¬ãªã¿ã€ããé¿ããã²ãŒã ãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠé©åã§ããããšã確èªããŠãã ããã
- æç¢ºãªããã¥ã¡ã³ãïŒ åã³ã³ããŒãã³ããšã·ã¹ãã ã®è©³çްãªèª¬æãå«ããã³ã³ããŒãã³ãã·ã¹ãã ã®å æ¬çãªããã¥ã¡ã³ããæäŸããŸããããã«ããã倿§ãªããã¯ã°ã©ãŠã³ããæã€éçºè ãã·ã¹ãã ãçè§£ãã䜿çšãããããªããŸãã
çµè«
ã³ã³ããŒãã³ãã·ã¹ãã ã¯ãã²ãŒã éçºã®ããã®åŒ·åã§æè»ãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãæäŸããŸããã¢ãžã¥ãŒã«æ§ãåå©çšæ§ãã³ã³ããžã·ã§ã³ãåãå ¥ããããšã§ãã³ã³ããŒãã³ãã·ã¹ãã ã¯éçºè ãè€éã§ã¹ã±ãŒã©ãã«ãªã²ãŒã ã¯ãŒã«ããäœæããããšãå¯èœã«ããŸããå°èŠæš¡ãªã€ã³ãã£ãŒã²ãŒã ãæ§ç¯ããŠããå Žåã§ããå€§èŠæš¡ãªAAAã¿ã€ãã«ãæ§ç¯ããŠããå Žåã§ããã³ã³ããŒãã³ãã·ã¹ãã ãçè§£ãå®è£ ããããšã¯ãéçºããã»ã¹ãšã²ãŒã ã®å質ãå€§å¹ ã«åäžãããããšãã§ããŸããã²ãŒã éçºã®æ ã«åºãã«ãããããã®ã¬ã€ãã§æŠèª¬ãããååãèæ ®ããŠããããžã§ã¯ãã®ç¹å®ã®ããŒãºãæºããå ç¢ã§é©å¿æ§ã®é«ãã³ã³ããŒãã³ãã·ã¹ãã ãèšèšããäžçäžã®ãã¬ã€ã€ãŒã®ããã«é åçãªäœéšãåµé ããããã«ã°ããŒãã«ã«èããããšãå¿ããªãã§ãã ããã